package com.dongdong.zhuangji.utils;

import org.springframework.stereotype.Component;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * @author dongdong 抖音号：W13883155245
 * @version 1.0
 * @date 2025/5/2
 * @description 时间拆分
 */
@Component
public class DateToDayTime {

    /**
     *  date 转换成 2025-05-02
     * @param date
     * @return
     */
    public  LocalDate toLoaclDay(Date date) {

        // 将 Date 转换为 LocalDate
        return  date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDate();

    }
    /**
     *  date 转换成 2025年05月02日
     * @param date
     * @return
     */
    public  String  toLoaclDays(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        // 格式化日期
        String formattedDate = sdf.format(date);
        return formattedDate;

    }

    /**
     *  转换成时间 20：10
     * @param date
     * @return
     */
    public  String toTime(Date date) {

        // 提取时间部分并格式化为 HH:mm
        LocalTime localTime = date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalTime();

        return  localTime.format(java.time.format.DateTimeFormatter.ofPattern("HH:mm"));


    }

    /**
     * 21:14 加 20 等于21:134
     * @param date
     * @param minute
     * @return
     */
    public String  toTime(Date date,int minute) {

        // 提取时间部分并格式化为 HH:mm
        LocalTime localTime = date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalTime();
        // 增加 minute=25 分钟
        LocalTime newTime = localTime.plusMinutes(minute);

        // 格式化输出结果
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
        return  newTime.format(formatter);
    }

    /**
     * 21:14 加 20 等于21:134
     * @param date
     * @param minute
     * @return
     */
    public String toDayTime(Date date, int minute) {
        // 将 Date 转换为 LocalDateTime
        LocalDateTime localDateTime = date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
        // 增加指定分钟数
        LocalDateTime newDateTime = localDateTime.plusMinutes(minute);


        // 格式化输出结果
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分");
        return newDateTime.format(formatter);
    }
    /**
     * 21:14 加 20 等于21:134
     * @param date
     * @param minute
     * @return
     */
    public String backDayTime(Date date, int minute) {
        // 将 Date 转换为 LocalDateTime
        LocalDateTime localDateTime = date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
        // 增加指定分钟数
        LocalDateTime newDateTime = localDateTime.minusMinutes(minute);


        // 格式化输出结果
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分");
        return newDateTime.format(formatter);
    }

    /**
     * 给指定日期增加指定分钟数
     * @param date 原始日期对象，允许为null
     * @param minutes 要增加的分钟数，可以为负数
     * @return 增加分钟后的新日期对象，如果原始日期为null则返回null
     */
    public Date addMinutesToDate(Date date, int minutes) {
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, minutes);
        return calendar.getTime();
    }
    /**
     * 从指定日期减去指定分钟数
     * @param date 原始日期对象，允许为null
     * @param minutes 要减去的分钟数，可以为负数（负负得正）
     * @return 减去分钟后的新日期对象，如果原始日期为null则返回null
     */
    public Date subtractMinutesFromDate(Date date, int minutes) {
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, -minutes); // 注意此处使用负号
        return calendar.getTime();
    }

    /**
     * 比较两个日期并返回较晚的日期
     * @param date1 第一个日期参数，允许为null
     * @param date2 第二个日期参数，允许为null
     * @return 较晚的日期，如果其中一个为null则返回另一个，若都为null则返回null
     */
    public Date getLaterDate(Date date1, Date date2) {
        if (date1 == null) return date2;
        if (date2 == null) return date1;
        return date1.after(date2) ? date1 : date2;
    }
    /**
     * 判断 date1 是否晚于 date2
     */
    public boolean isAfter(Date date1, Date date2) {
        return date1 != null && date2 != null && date1.after(date2);
    }

    public static void main(String[] args) {
        DateToDayTime dateToDayTime = new DateToDayTime();
        System.out.println(dateToDayTime.toTime(new Date()));
        System.out.println(dateToDayTime.toTime(new Date(),20));
        System.out.println(dateToDayTime.toLoaclDays(new Date()));
        System.out.println(dateToDayTime.toDayTime(new Date(),20));
        System.out.println(dateToDayTime.backDayTime(new Date(),20));

        System.out.println(dateToDayTime.addMinutesToDate(new Date(),20));
        System.out.println(dateToDayTime.subtractMinutesFromDate(new Date(),20));

    }

    /*public static void main(String[] args) {
        double number = 12130.230456;

        // 使用 DecimalFormat 类
        DecimalFormat df = new DecimalFormat("K0+000.00");
        String result1 = df.format(number);
        System.out.println("使用 DecimalFormat 结果: " + result1);

        // 使用 String.format 方法
        String result2 = String.format("%.2f", number);
        System.out.println("使用 String.format 结果: " + result2);
    }*/
}
